package com.buaa.divinationmaster.core.database.dao;

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;

import com.buaa.divinationmaster.core.database.entities.DivinationHistory;

import java.util.List;

/**
 * 占卜历史数据访问对象 (DAO)
 * 提供占卜历史记录的CRUD操作，支持搜索、筛选、分页等功能
 */
@Dao
public interface DivinationHistoryDao {
    
    /**
     * 获取所有占卜历史，按时间倒序排列
     * @return LiveData包装的占卜历史列表
     */
    @Query("SELECT * FROM divination_history ORDER BY timestamp DESC")
    LiveData<List<DivinationHistory>> getAllHistory();
    
    /**
     * 获取所有占卜历史 (同步方法)
     * @return 占卜历史列表
     */
    @Query("SELECT * FROM divination_history ORDER BY timestamp DESC")
    List<DivinationHistory> getAllHistorySync();
    
    /**
     * 根据占卜类型获取历史记录
     * @param type 占卜类型 (tarot/plumblossom/coinoracle/lenormand)
     * @return LiveData包装的特定类型历史列表
     */
    @Query("SELECT * FROM divination_history WHERE type = :type ORDER BY timestamp DESC")
    LiveData<List<DivinationHistory>> getHistoryByType(String type);
    
    /**
     * 根据占卜类型获取历史记录 (同步方法)
     * @param type 占卜类型
     * @return 特定类型历史列表
     */
    @Query("SELECT * FROM divination_history WHERE type = :type ORDER BY timestamp DESC")
    List<DivinationHistory> getHistoryByTypeSync(String type);
    
    /**
     * 获取收藏的占卜历史
     * @return LiveData包装的收藏历史列表
     */
    @Query("SELECT * FROM divination_history WHERE is_favorite = 1 ORDER BY timestamp DESC")
    LiveData<List<DivinationHistory>> getFavoriteHistory();
    
    /**
     * 获取收藏的占卜历史 (同步方法)
     * @return 收藏历史列表
     */
    @Query("SELECT * FROM divination_history WHERE is_favorite = 1 ORDER BY timestamp DESC")
    List<DivinationHistory> getFavoriteHistorySync();
    
    /**
     * 根据问题内容搜索历史记录
     * @param searchQuery 搜索关键词
     * @return LiveData包装的搜索结果
     */
    @Query("SELECT * FROM divination_history WHERE question LIKE '%' || :searchQuery || '%' ORDER BY timestamp DESC")
    LiveData<List<DivinationHistory>> searchHistory(String searchQuery);
    
    /**
     * 根据问题内容和解读搜索历史记录
     * @param searchQuery 搜索关键词
     * @return 搜索结果列表
     */
    @Query("SELECT * FROM divination_history WHERE question LIKE '%' || :searchQuery || '%' OR interpretation LIKE '%' || :searchQuery || '%' ORDER BY timestamp DESC")
    List<DivinationHistory> searchHistorySync(String searchQuery);
    
    /**
     * 根据标签搜索历史记录
     * @param tag 标签
     * @return 包含特定标签的历史记录
     */
    @Query("SELECT * FROM divination_history WHERE tags LIKE '%' || :tag || '%' ORDER BY timestamp DESC")
    List<DivinationHistory> getHistoryByTag(String tag);
    
    /**
     * 根据日期获取历史记录
     * @param date 日期 (YYYY-MM-DD格式)
     * @return 特定日期的历史记录
     */
    @Query("SELECT * FROM divination_history WHERE created_date = :date ORDER BY timestamp DESC")
    List<DivinationHistory> getHistoryByDate(String date);
    
    /**
     * 根据时间范围获取历史记录
     * @param startTime 开始时间戳
     * @param endTime 结束时间戳
     * @return 指定时间范围的历史记录
     */
    @Query("SELECT * FROM divination_history WHERE timestamp >= :startTime AND timestamp <= :endTime ORDER BY timestamp DESC")
    List<DivinationHistory> getHistoryByTimeRange(long startTime, long endTime);
    
    /**
     * 获取最近的历史记录
     * @param limit 限制数量
     * @return 最近的历史记录
     */
    @Query("SELECT * FROM divination_history ORDER BY timestamp DESC LIMIT :limit")
    List<DivinationHistory> getRecentHistory(int limit);
    
    /**
     * 根据用户评分获取历史记录
     * @param minRating 最小评分
     * @return 评分不低于指定值的历史记录
     */
    @Query("SELECT * FROM divination_history WHERE user_rating >= :minRating ORDER BY timestamp DESC")
    List<DivinationHistory> getHistoryByRating(int minRating);
    
    /**
     * 获取分页历史记录
     * @param limit 每页数量
     * @param offset 偏移量
     * @return 分页历史记录
     */
    @Query("SELECT * FROM divination_history ORDER BY timestamp DESC LIMIT :limit OFFSET :offset")
    List<DivinationHistory> getHistoryPaged(int limit, int offset);
    
    /**
     * 根据ID获取特定历史记录
     * @param id 历史记录ID
     * @return 历史记录对象
     */
    @Query("SELECT * FROM divination_history WHERE id = :id")
    DivinationHistory getHistoryById(long id);
    
    /**
     * 根据ID获取历史记录 (LiveData)
     * @param id 历史记录ID
     * @return LiveData包装的历史记录
     */
    @Query("SELECT * FROM divination_history WHERE id = :id")
    LiveData<DivinationHistory> getHistoryByIdLive(long id);
    
    /**
     * 插入新的占卜历史记录
     * @param history 历史记录对象
     * @return 插入的行ID
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insert(DivinationHistory history);
    
    /**
     * 批量插入历史记录
     * @param historyList 历史记录列表
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(List<DivinationHistory> historyList);
    
    /**
     * 更新历史记录
     * @param history 历史记录对象
     */
    @Update
    void update(DivinationHistory history);
    
    /**
     * 删除历史记录
     * @param history 历史记录对象
     */
    @Delete
    void delete(DivinationHistory history);
    
    /**
     * 根据ID删除历史记录
     * @param id 历史记录ID
     */
    @Query("DELETE FROM divination_history WHERE id = :id")
    void deleteById(long id);
    
    /**
     * 删除指定时间之前的历史记录
     * @param cutoffTime 截止时间戳
     */
    @Query("DELETE FROM divination_history WHERE timestamp < :cutoffTime")
    void deleteOldHistory(long cutoffTime);
    
    /**
     * 删除指定类型的所有历史记录
     * @param type 占卜类型
     */
    @Query("DELETE FROM divination_history WHERE type = :type")
    void deleteByType(String type);
    
    /**
     * 获取历史记录总数
     * @return 总数
     */
    @Query("SELECT COUNT(*) FROM divination_history")
    int getHistoryCount();
    
    /**
     * 获取特定类型的历史记录数量
     * @param type 占卜类型
     * @return 特定类型的记录数量
     */
    @Query("SELECT COUNT(*) FROM divination_history WHERE type = :type")
    int getHistoryCountByType(String type);
    
    /**
     * 获取收藏的历史记录数量
     * @return 收藏记录数量
     */
    @Query("SELECT COUNT(*) FROM divination_history WHERE is_favorite = 1")
    int getFavoriteCount();
    
    /**
     * 获取今天的历史记录数量
     * @param todayDate 今天的日期 (YYYY-MM-DD格式)
     * @return 今天的记录数量
     */
    @Query("SELECT COUNT(*) FROM divination_history WHERE created_date = :todayDate")
    int getTodayHistoryCount(String todayDate);
    
    /**
     * 获取所有不重复的标签
     * @return 标签列表
     */
    @Query("SELECT DISTINCT tags FROM divination_history WHERE tags IS NOT NULL AND tags != ''")
    List<String> getAllTags();
    
    /**
     * 获取所有不重复的日期
     * @return 日期列表
     */
    @Query("SELECT DISTINCT created_date FROM divination_history ORDER BY created_date DESC")
    List<String> getAllDates();
    
    /**
     * 获取各类型占卜的统计信息
     * @return 类型统计 (type, count)
     */
    @Query("SELECT type, COUNT(*) as count FROM divination_history GROUP BY type ORDER BY count DESC")
    List<TypeCount> getTypeStatistics();
    
    /**
     * 更新收藏状态
     * @param id 历史记录ID
     * @param isFavorite 是否收藏
     */
    @Query("UPDATE divination_history SET is_favorite = :isFavorite WHERE id = :id")
    void updateFavoriteStatus(long id, boolean isFavorite);
    
    /**
     * 更新用户评分
     * @param id 历史记录ID
     * @param rating 评分 (1-5)
     */
    @Query("UPDATE divination_history SET user_rating = :rating WHERE id = :id")
    void updateUserRating(long id, int rating);
    
    /**
     * 更新准确度反馈
     * @param id 历史记录ID
     * @param feedback 准确度反馈 (1-5)
     */
    @Query("UPDATE divination_history SET accuracy_feedback = :feedback WHERE id = :id")
    void updateAccuracyFeedback(long id, int feedback);
    
    /**
     * 清空所有历史记录
     */
    @Query("DELETE FROM divination_history")
    void deleteAll();
    
    /**
     * 类型统计内部类
     */
    public static class TypeCount {
        public String type;
        public int count;
        
        public TypeCount(String type, int count) {
            this.type = type;
            this.count = count;
        }
    }
}
